/*
	This file is part of AVRCppLib.

    AVRCppLib is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    AVRCppLib is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with AVRCppLib.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) Maxime Lemonnier 2007-2011
 */

#ifndef PollUSART_H_
#define PollUSART_H_

#include "../USARTHardware.h"
#include "../../../DataStructures/ActiveBuffers/ActiveReceiveBuffers/ActiveReceiveBuffer.h"
#include "../../../DataStructures/ActiveBuffers/ActiveReceiveBuffers/ActiveReceiveBufferObserver.h"
#include "../../../DataStructures/ActiveBuffers/ActiveTransmitBuffers/ActiveTransmitBuffer.h"
#include "../../../DataStructures/ActiveBuffers/ActiveTransmitBuffers/ActiveTransmitBufferObserver.h"
namespace Coms
{

namespace USART
{

class ActiveBufferedUSART : public ActiveReceiveBufferObserver, public ActiveTransmitBufferObserver
{
public:

	ActiveBufferedUSART(USARTHardware * usart);

	virtual ~ActiveBufferedUSART();

	void setCurrentReceiveBuffer(ActiveReceiveBuffer * receiveBuffer);

	void enableReceiver();

	void enableFrameReceivedInterrupts();

	void fillCurrentReceiveBuffer();

	void readOperation();

	void disableReceiver();

	void disableFrameReceivedInterrupts();

	ActiveReceiveBuffer * reclaimCurrentReceiveBuffer();

	void releaseCurrentReceiveBuffer();

	void setCurrentTransmitBuffer(ActiveTransmitBuffer * transmitBuffer);

	void enableTransmitter();

	void enableTransmitterReadyInterrupts();

	void flushCurrentTransmitBuffer();

	void writeOperation();

	void writeBaudSleepSafe();

	void disableTransmitter();

	void disableTransmitterReadyInterrupts();

	ActiveTransmitBuffer * reclaimCurrentTransmitBuffer();

	void releaseCurrentTransmitBuffer();

protected :

	void waitTransmitter();

	void waitReceiver();

	ActiveTransmitBuffer * currentTransmitBuffer;

	ActiveReceiveBuffer * currentReceiveBuffer;

	USARTHardware * usart;
};

}

}

#endif /* PollUSART_H_ */
